﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

using Noris.Schedule.Support.Services;
using Noris.Schedule.Planning.ProcessData;
using Noris.Schedule.Support.Core;
using Noris.Schedule.Support;

namespace Noris.Schedule.Planning.Services
{
    #region Funkce pro zafiltrování na řádky v grafu Poptávky, které obsahují elementy v minulosti
    /// <summary>
    /// Funkce pro zafiltrování na řádky v grafu Poptávky, které obsahují elementy v minulosti
    /// </summary>
    internal class FilterHistory : IFunctionMenuItem
    {
        /// <summary>
        /// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
        /// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
        {
            // Filtrovat lze pouze v grafu Poptávky - Gantt, na kterémkoli místě grafu, v řádku Osa S:
            bool isArea = (args.KeyAreaType == FunctionMenuItemAreaType.EmptyRow || 
                           args.KeyAreaType == FunctionMenuItemAreaType.GraphElement || 
                           args.KeyAreaType == FunctionMenuItemAreaType.RowHeader || 
                           args.KeyAreaType == FunctionMenuItemAreaType.TextItem);

            int classMain = Noris.Schedule.Planning.ProcessData.Constants.ClassNumberAxis;
            int classSub = Noris.Schedule.Planning.ProcessData.Constants.ClassNumberAxisSubRow;
            bool isAxisGantt = (args.KeyGraphMode == RowGraphMode.Gantt && (args.KeyRowClassNumber == classMain ||args.KeyRowClassNumber == classSub));
            bool isCompLink = (args.KeyGraphMode == RowGraphMode.TaskCapacityLink && args.KeyRowClassNumber == classSub);

            bool isSuitable = (isArea && (isAxisGantt || isCompLink));

            if (isSuitable)
            {
                args.MenuCaption = "Zobrazit pouze minulost";
                args.MenuToolTipText = "Aplikuje filtr na položky, jejichž provedení se plánuje v minulosti (včetně dneška).";
                args.MenuImage = PicLibrary22.EmblemUrgent_FromFile;
                args.MenuGroup = "FILTER";
                args.MenuOrder = -100;
                args.EnabledStateDependingOnElement = false;
            }
            return isSuitable;
        }
        /// <summary>
        /// Dotaz na Enabled této položky menu, při znalosti konkrétních podmínek (máme vybraný konkrétní element).
        /// Výstup = true nyní je tato položka menu dostupná
        /// false = nyní je nedostupná
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
        {
            return true;
        }
        /// <summary>
        /// Vstupní metoda do výkonné části pluginu
        /// </summary>
        /// <param name="args"></param>
        void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
        {
            MfrPlanningConnectorCls planningConnector;
            if (!PlanningDataCls.TryGetPlanningConnector(args.DataSource, out planningConnector)) return;

            DateTime date = PlanningParametersCls.Current.InitialDate.Date.AddDays(1d);         // DatumČas : zítra, 00:00:00   Hlídáme elementy, jejichž End < date

            TimeRange timeRange = new TimeRange(date, date);
            Dictionary<GID, object> filter = new Dictionary<GID, object>();
            List<IDataRow> rows = planningConnector.ReadRowsGetAllPlanAxisS(axis => this._FilterAxisSByTime(axis, date));
            foreach (IDataRow row in rows)
            {
                if (!filter.ContainsKey(row.GId) && row.ElementList != null && row.ElementList.Any(e => e.TimeRange.Begin < date))
                {
                    DateTime firstBegin = row.ElementList.Min(e => e.TimeRange.Begin);
                    if (firstBegin < timeRange.Begin)
                        timeRange.Begin = firstBegin;
                    filter.Add(row.GId, null);
                }
            }

            if (filter.Count > 0)
            {   // Máme na co filtrovat?
                args.ResultRowFilterList.AddRange(filter.Keys);
                args.ResultSetTimeRange = timeRange;
            }
            else
            {
                Dialog.ShowInfo("Nebyla nalezena žádná událost v minulosti.");
            }
        }
        /// <summary>
        /// Filtr záznamů osy S, které se mají zohledňovat při načítání řádků
        /// </summary>
        /// <param name="axis"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        private bool _FilterAxisSByTime(MaterialPlanAxisItemCls axis, DateTime date)
        {
            if (axis.IsRealItem)
                // U reálných položek osy S chci zobrazit případy, které KONČÍ v minulosti:
                return (axis.DatePlanEnd < date);
            // U plánu chci zobrazit případy, které ZAČÍNAJÍ v minulosti:
            return (axis.DatePlanBegin < date);
        }
    }
    #endregion
}
